<?php  if ( ! defined('BASE_PATH')) exit('No direct script access allowed');
/////////////////////////////////////////////////////////////////////////////
//
// SuperPHP - 快速的中文PHP框架
//
// @package		SuperPHP
// @author		hmw@superphp.org
// @copyright	Copyright (c) 2010, SuperPHP.ORG
// @license		http://www.superphp.org/user_guide/license.html
// @link		http://www.superphp.org
// @since		Version 1.0
//
// 许可协议请查看 http://www.SuperPHP.org/
//
/////////////////////////////////////////////////////////////////////////////

// ------------------------------------------------------------------------

/**
 * Database Utility Class
 *
 * @category	Database
 * @author		hmw@superphp.org
 * @link		http://www.superphp.org
 */
class Super_Db_Forge {

	protected $fields		 	= array();
	protected $keys             = array();
	protected $primary_keys 	= array();
	protected $db_char_set      = '';

	/**
	 * Constructor
	 *
	 * Grabs the CI super object instance so we can access it.
	 *
	 */	
    public function  __construct() {
        // Assign the main database object to $this->db
        $this->db =Super_Registry::get('db');
        log_message('debug', "Database Forge Class Initialized");
    }

	// --------------------------------------------------------------------

	/**
	 * Create database
	 *
	 * @access	public
	 * @param	string	the database name
	 * @return	bool
	 */
    public function create_database($db_name) {
        $sql = $this->_create_database($db_name);

        if (is_bool($sql)) {
            return $sql;
        }

        return $this->db->query($sql);
    }

	// --------------------------------------------------------------------

	/**
	 * Drop database
	 *
	 * @access	public
	 * @param	string	the database name
	 * @return	bool
	 */
    public function drop_database($db_name) {
        $sql = $this->_drop_database($db_name);

        if (is_bool($sql)) {
            return $sql;
        }

        return $this->db->query($sql);
    }

	// --------------------------------------------------------------------

	/**
	 * Add Key
	 *
	 * @access	public
	 * @param	string	key
	 * @param	string	type
	 * @return	void
	 */
    public function add_key($key = '', $primary = FALSE) {
        if (is_array($key)) {
            foreach($key as $one) {
                $this->add_key($one, $primary);
            }
            
            return;
        }

        if ($key == '') {
            $this->show_error('Key information is required for that operation.');
        }

        if ($primary === TRUE) {
            $this->primary_keys[] = $key;
        }
        else {
            $this->keys[] = $key;
        }
    }

	// --------------------------------------------------------------------

	/**
	 * Add Field
	 *
	 * @access	public
	 * @param	string	collation
	 * @return	void
	 */
    public function add_field($field = '') {
        if ($field == '') {
            $this->show_error('Field information is required.');
        }

        if (is_string($field)) {
            if ($field == 'id') {
                $this->add_field(array(
                        'id' => array(
                                'type' => 'INT',
                                'constraint' => 9,
                                'auto_increment' => TRUE
                        )
                ));
                $this->add_key('id', TRUE);
            } else {
                if (strpos($field, ' ') === FALSE) {
                    $this->show_error('Field information is required for that operation.');
                }

                $this->fields[] = $field;
            }
        }

        if (is_array($field)) {
            $this->fields = array_merge($this->fields, $field);
        }

    }

	// --------------------------------------------------------------------

	/**
	 * Create Table
	 *
	 * @access	public
	 * @param	string	the table name
	 * @return	bool
	 */
    public function create_table($table = '', $if_not_exists = FALSE) {
        if ($table == '') {
            $this->show_error('A table name is required for that operation.');
        }

        if (count($this->fields) == 0) {
            $this->show_error('Field information is required.');
        }

        $sql = $this->_create_table($this->db->dbprefix.$table, $this->fields, $this->primary_keys, $this->keys, $if_not_exists);

        $this->_reset();
        return $this->db->query($sql);
    }

	// --------------------------------------------------------------------

	/**
	 * Drop Table
	 *
	 * @access	public
	 * @param	string	the table name
	 * @return	bool
	 */
    public function drop_table($table_name) {
        $sql = $this->_drop_table($this->db->dbprefix.$table_name);

        if (is_bool($sql)) {
            return $sql;
        }

        return $this->db->query($sql);
    }

	// --------------------------------------------------------------------

	/**
	 * Rename Table
	 *
	 * @access	public
	 * @param	string	the old table name
	 * @param	string	the new table name
	 * @return	bool
	 */
    public function rename_table($table_name, $new_table_name) {
        if ($table_name == '' OR $new_table_name == '') {
            $this->show_error('A table name is required for that operation.');
        }

        $sql = $this->_rename_table($table_name, $new_table_name);
        return $this->db->query($sql);
    }

	// --------------------------------------------------------------------

	/**
	 * Column Add
	 *
	 * @access	public
	 * @param	string	the table name
	 * @param	string	the column name
	 * @param	string	the column definition
	 * @return	bool
     */
    public function add_column($table = '', $field = array(), $after_field = '') {
        if ($table == '') {
            $this->show_error('A table name is required for that operation.');
        }

        // add field info into field array, but we can only do one at a time
        // so only grab the first field in the event there are more then one
        $this->add_field(array_slice($field, 0, 1));

        if (count($this->fields) == 0) {
            $this->show_error('Field information is required.');
        }

        $sql = $this->_alter_table('ADD', $this->db->dbprefix.$table, $this->fields, $after_field);

        $this->_reset();
        return $this->db->query($sql);
    }

	// --------------------------------------------------------------------

	/**
	 * Column Drop
	 *
	 * @access	public
	 * @param	string	the table name
	 * @param	string	the column name
	 * @return	bool
	 */
    public function drop_column($table = '', $column_name = '') {

        if ($table == '') {
            $this->show_error('A table name is required for that operation.');
        }

        if ($column_name == '') {
            $this->show_error('A column name is required for that operation.');
        }

        $sql = $this->_alter_table('DROP', $this->db->dbprefix.$table, $column_name);

        return $this->db->query($sql);
    }

	// --------------------------------------------------------------------

	/**
	 * Column Modify
	 *
	 * @access	public
	 * @param	string	the table name
	 * @param	string	the column name
	 * @param	string	the column definition
	 * @return	bool
	 */
    public function modify_column($table = '', $field = array()) {
        if ($table == '') {
            $this->show_error('A table name is required for that operation.');
        }

        // add field info into field array, but we can only do one at a time
        // so only grab the first field in the event there are more then one
        $this->add_field(array_slice($field, 0, 1));

        if (count($this->fields) == 0) {
            $this->show_error('Field information is required.');
        }

        $sql = $this->_alter_table('CHANGE', $this->db->dbprefix.$table, $this->fields);

        $this->_reset();
        return $this->db->query($sql);
    }

	// --------------------------------------------------------------------

	/**
	 * Reset
	 *
	 * Resets table creation vars
	 *
	 * @access	private
	 * @return	void
	 */
    private function _reset() {
        $this->fields 		= array();
        $this->keys			= array();
        $this->primary_keys 	= array();
    }

    public function show_error($error){
        log_message('error', $error);
        if(SUPER_DEBUG){
            showError($error);
        }
    }

}